package de.vogella.gwt.helloserver.client;



import java.util.ArrayList;

import com.google.gwt.core.client.GWT;
import com.google.gwt.event.dom.client.ChangeEvent;
import com.google.gwt.event.dom.client.ChangeHandler;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Composite;
import com.google.gwt.user.client.ui.DecoratedTabPanel;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.Label;
import com.google.gwt.user.client.ui.ListBox;
import com.google.gwt.user.client.ui.Grid;

import de.vogella.gwt.helloserver.client.model.Arbeitsgang;
import de.vogella.gwt.helloserver.client.model.Produkt;
import com.google.gwt.user.client.ui.HasVerticalAlignment;

public class ArbeitsplanGUI extends Composite{
	
	private final ServiceAsync service = GWT.create(Service.class);
	private ListBox lbProduktID = new ListBox();
	private FlexTable flexTable = new FlexTable();

	Label lblLaufzeit = new Label("Laufzeit");
	Label lblKosten = new Label("Kosten");
	
	public ArbeitsplanGUI(){
		DecoratedTabPanel decoratedTabPanel = new DecoratedTabPanel();
		initWidget(decoratedTabPanel);
		
		VerticalPanel verticalPanel = new VerticalPanel();
		decoratedTabPanel.add(verticalPanel, "Arbeitsplan", false);		
		
		Grid grid = new Grid(1, 2);
		verticalPanel.add(grid);
		
		Label lblProduktID = new Label("Produkt ID");
		lblProduktID.setWordWrap(false);
		grid.setWidget(0, 0, lblProduktID);		
		
		grid.setWidget(0, 1, lbProduktID);
		lbProduktID.setVisibleItemCount(1);
		
		verticalPanel.add(flexTable);	
		
		Grid grid_1 = new Grid(2, 2);
		verticalPanel.add(grid_1);		
		
		grid_1.setWidget(0, 0, lblLaufzeit);		
		grid_1.setWidget(1, 0, lblKosten);	

		lblKosten.setVisible(false);
		lblLaufzeit.setVisible(false);
		
		grid_1.getCellFormatter().setVerticalAlignment(1, 1, HasVerticalAlignment.ALIGN_TOP);
		
		lbProduktID.addChangeHandler(new ChangeHandler() {			
			public void onChange(ChangeEvent event) {				
				service.getArbeitsgang(lbProduktID.getItemText(lbProduktID.getSelectedIndex()),new AsyncCallback<ArrayList<Arbeitsgang>>() {

					@Override
					public void onFailure(Throwable caught) {
						Window.alert(caught.getMessage());
					}

					@Override
					public void onSuccess(ArrayList<Arbeitsgang> result) {
						if(result.size() > 0){
							showTable(result);
						}
						else
						{
							flexTable.removeAllRows();
							lblKosten.setVisible(false);
							lblLaufzeit.setVisible(false);
						}
					}
				});
			}
		});
				
				

			
		
	
		service.getProdukte(new AsyncCallback<ArrayList<Produkt>>() {

			@Override
			public void onFailure(Throwable caught) {
				Window.alert(caught.getMessage());
			}

			@Override
			public void onSuccess(ArrayList<Produkt> result) {
				for(Produkt p : result){
					lbProduktID.addItem(p.getId());
				}
			}
		});
	}
	
	private void showTable(ArrayList<Arbeitsgang> list){

		int laufzeit = 0;
		double kosten = 0;
		double stueckkosten = 0;
		
		flexTable.removeAllRows();
		
		flexTable.setText(0, 0, "Position");
		flexTable.setText(0, 1, "Produkt ID");
		flexTable.setText(0, 2, "AG ID");
		flexTable.setText(0, 3, "AG Bezeichnung");
		flexTable.setText(0, 4, "K ID");
		flexTable.setText(0, 5, "K Bezeichnung");
		flexTable.setText(0, 6, "Ruestzeit");
		flexTable.setText(0, 7, "Stueckzeit");
		flexTable.setText(0, 8, "Maschinensatz");
		flexTable.setText(0, 9, "Maschinenkosten");
		
		int i = 1;
		for(Arbeitsgang a : list){
			flexTable.setText(i, 0, a.getPosition());
			flexTable.setText(i, 1, a.getProduktID());
			flexTable.setText(i, 2, a.getArbeitsgangID());
			flexTable.setText(i, 3, a.getArbeitsgangBez());
			flexTable.setText(i, 4, a.getKapazitaetID());
			flexTable.setText(i, 5, a.getKapazitaetBez());
			flexTable.setText(i, 6, a.getRuestzeit()+"");
			flexTable.setText(i, 7, a.getStueckzeit()+"");
			flexTable.setText(i, 8, a.getStundensatz()+"");
			stueckkosten = a.getStundensatz()/60D/60D * a.getStueckzeit();
			stueckkosten=Math.rint(stueckkosten*100)/100;
			kosten += stueckkosten;
			flexTable.setText(i, 9, stueckkosten+"");
			laufzeit += a.getStueckzeit();			
			i++;
		}
		lblLaufzeit.setText("Laufzeit: " + laufzeit + " Sekunden");
		lblKosten.setText("Kosten: " + Math.rint(kosten*100)/100 + " Euro");
		lblKosten.setVisible(true);
		lblLaufzeit.setVisible(true);		
	}
	

	
	
	


		
	
}
